package com.csun.cmny.provider.service.impl;

import com.csun.cmny.base.dto.LoginAuthDto;
import com.csun.cmny.base.enums.ErrorCodeEnum;
import com.csun.cmny.core.support.BaseService;
import com.csun.cmny.provider.dao.OmcExpenseItemMapper;
import com.csun.cmny.provider.exceptions.OmcBizException;
import com.csun.cmny.provider.model.domain.OmcExpenseItem;
import com.csun.cmny.provider.model.domain.OmcExpenseType;
import com.csun.cmny.provider.model.domain.OmcExpenseTypeModelCode;
import com.csun.cmny.provider.model.domain.OmcOldmanExpenseItem;
import com.csun.cmny.provider.model.dto.expenseItem.ExpenseItemSelectDto;
import com.csun.cmny.provider.model.vo.expenItem.ExpenseItemTheVo;
import com.csun.cmny.provider.service.OmcExpenseItemService;
import com.csun.cmny.provider.service.OmcExpenseTypeModelCodeService;
import com.csun.cmny.provider.service.OmcExpenseTypeService;
import com.csun.cmny.provider.service.OmcOldmanExpenseItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

@Service
@Slf4j
@Transactional
public class OmcExpenseItemServiceImpl extends BaseService<OmcExpenseItem> implements OmcExpenseItemService {

    @Resource
    private OmcExpenseItemMapper omcExpenseItemMapper;

    @Resource
    private OmcExpenseTypeService omcExpenseTypeService;

    @Resource
    private OmcOldmanExpenseItemService omcOldmanExpenseItemService;

    @Resource
    private OmcExpenseTypeModelCodeService omcExpenseTypeModelCodeService;

    @Override
    public Integer addUsedTimes(List<Long> idList) {

        int count = 0;
        //isDelete自增1
        for(Long id : idList){
            OmcExpenseItem item = omcExpenseItemMapper.selectByPrimaryKey(id);
            if(item == null){
                throw new OmcBizException(ErrorCodeEnum.OMC10037011);
            }
            item.setIsDelete(item.getIsDelete()+1);
            int ret = omcExpenseItemMapper.updateByPrimaryKeySelective(item);
            count += ret;
        }
        return count;
    }

    @Override
    public Integer subUsedTimes(List<Long> idList) {

        int count = 0;
        //isDelete自减1
        for(Long id : idList){
            OmcExpenseItem item = omcExpenseItemMapper.selectByPrimaryKey(id);
            item.setIsDelete(item.getIsDelete()-1);
            int ret = omcExpenseItemMapper.updateByPrimaryKeySelective(item);
            count += ret;
        }
        return count;
    }

    @Override
    public Integer saveExpenseItem(OmcExpenseItem omcExpenseItem, LoginAuthDto loginAuthDto) {

        //放入操作者信息
        //如果没有传groupId,放入操作员groupId
        Long groupId = loginAuthDto.getGroupId();

        if(omcExpenseItem.getGroupId() != null && !omcExpenseItem.getGroupId().equals(0)){
            groupId = omcExpenseItem.getGroupId();
        }
        omcExpenseItem.setGroupId(groupId);
        omcExpenseItem.setUpdateInfo(loginAuthDto);

        //同名校验
        /*
        * 需要添加同名服务项名称
        * */
        /*if(!checkName(omcExpenseItem)){
            throw new OmcBizException(ErrorCodeEnum.OMC10033003);
        }*/

        //护理费重复校验
        checkCareFeeRepeat(omcExpenseItem);

        //床位费重复校验
        checkBedFeeRepeat(omcExpenseItem);

        //如果是入院流程费用项目 校验收费方式是否为 元/一次性
        checkOldmanInExpenseItem(omcExpenseItem);

        System.out.println("费用结果为"+omcExpenseItem);

        //判断是新增还是修改
        if(omcExpenseItem.isNew()){

            //校验消费类别是否存在
            OmcExpenseType omcExpenseTypeCheck = new OmcExpenseType();
            omcExpenseTypeCheck.setId((long)omcExpenseItem.getExpenseTypeId());
            List<OmcExpenseType> omcExpenseTypeList = omcExpenseTypeService.select(omcExpenseTypeCheck);
            if(omcExpenseTypeList.size() < 1){
                throw new OmcBizException(ErrorCodeEnum.OMC10037004);
            }
            return omcExpenseItemMapper.insertSelective(omcExpenseItem);
        }else{
            return omcExpenseItemMapper.updateByPrimaryKeySelective(omcExpenseItem);
        }

    }

    private void checkOldmanInExpenseItem(OmcExpenseItem omcExpenseItem) {
        OmcExpenseTypeModelCode modelCodeQuery = new OmcExpenseTypeModelCode();
        modelCodeQuery.setExpenseTypeId(omcExpenseItem.getExpenseTypeId().longValue());
        modelCodeQuery = omcExpenseTypeModelCodeService.selectOne(modelCodeQuery);
        if(modelCodeQuery != null){
            if(modelCodeQuery.getModelCode().equals(1)){
                if(!omcExpenseItem.getCostType().equals(5)){
                    throw new OmcBizException(ErrorCodeEnum.OMC10037040);
                }
            }
        }
    }

    @Override
    public Integer deleteExpenseItemById(Long expenseItemId, LoginAuthDto loginAuthDto) {

        Example example = new Example(OmcOldmanExpenseItem.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("expenseItemId",expenseItemId);
        int ret = omcOldmanExpenseItemService.selectCountByExample(example);
        if(ret > 0){
            throw new OmcBizException(ErrorCodeEnum.OMC10037001);
        }else{
            return deleteByKey(expenseItemId);
        }

    }

    @Override
    public List<OmcExpenseItem> selectByIdList(List<Long> idList) {

        List<OmcExpenseItem> itemList = omcExpenseItemMapper.selectByIdList(idList);

        return itemList;
    }

    @Override
    public List<ExpenseItemTheVo> selectExpenItem(ExpenseItemSelectDto expenseItemSelectDto) {
        return omcExpenseItemMapper.selectExpenItem(expenseItemSelectDto);
    }

    //同名校验
    public boolean checkName(OmcExpenseItem omcExpenseItem){

        Example example = new Example(OmcExpenseItem.class);
        Example.Criteria criteria = example.createCriteria();

        //添加校验条件
        criteria.andEqualTo("itemName",omcExpenseItem.getItemName());
        criteria.andEqualTo("groupId",omcExpenseItem.getGroupId());
        if(omcExpenseItem.getId() != null){
            criteria.andNotEqualTo("id",omcExpenseItem.getId());
        }
        int result = selectCountByExample(example);
        return result<1;

    }

    //护理费重复校验
    public void checkCareFeeRepeat(OmcExpenseItem omcExpenseItem){
        Example example = new Example(OmcExpenseItem.class);
        Example.Criteria criteria = example.createCriteria();
        if(omcExpenseItem.getLevelCareId() != null){
            criteria.andEqualTo("levelCareId",omcExpenseItem.getLevelCareId());
            criteria.andEqualTo("groupId",omcExpenseItem.getGroupId());
            if(omcExpenseItem.getId() != null){
                criteria.andNotEqualTo("id",omcExpenseItem.getId());
            }
            if(selectCountByExample(example) > 0 ){
                throw new OmcBizException(ErrorCodeEnum.OMC10037023);
            }
        }
    }

    //床位费重复校验
    public void checkBedFeeRepeat(OmcExpenseItem omcExpenseItem){
        Example example = new Example(OmcExpenseItem.class);
        Example.Criteria criteria = example.createCriteria();
        if(omcExpenseItem.getRoomType() != null && omcExpenseItem.getHasToilet() != null){
            criteria.andEqualTo("roomType",omcExpenseItem.getRoomType());
            criteria.andEqualTo("hasToilet",omcExpenseItem.getHasToilet());
            criteria.andEqualTo("groupId",omcExpenseItem.getGroupId());
            if(omcExpenseItem.getId() != null){
                criteria.andNotEqualTo("id",omcExpenseItem.getId());
            }
            if(selectCountByExample(example) > 0 ){
                throw new OmcBizException(ErrorCodeEnum.OMC10037048);
            }
        }
    }

}
